# coding=utf-8
from demoScripts.bedcore.client import ClientSystem, clientApi, levelId
from demoScripts.client.config import ClientConfig
from demoScripts.client.data import config


class MainSystem(ClientSystem):
    # 注册配置用到的命名空间
    CONFIG_REGISTER_KEY = 'demo'

    def __init__(self, namespace, systemName):
        super(MainSystem, self).__init__(namespace, systemName)

    def addEventListen(self, namespace, systemName):
        self.ListenForEvent('Phosphorus', 'main', 'PhosphorusLoadedEvent', self, self.PhosphorusLoadedEvent)
        self.ListenForEvent('Phosphorus', 'main', 'ClientConfigChangedEvent', self, self.ClientConfigChangedEvent)
        self.ListenForEvent('Phosphorus', 'main', 'ClientButtonClickedEvent', self, self.ClientButtonClickedEvent)

    def Destroy(self):
        super(MainSystem, self).Destroy()
        # 保存配置
        config.persistence()

    def PhosphorusLoadedEvent(self, args):
        # 磷客户端加载完成事件
        # 在此事件触发后，才能安全地获取到Phosphorus客户端的config组件
        comp = clientApi.CreateComponent(levelId, 'Phosphorus', 'config')

        # 获取配置构建器，并实例化配置构建器
        builder = comp.GetConfigBuilder()()
        # 实例化ClientConfig类（不调用create方法即可实例化为默认值）
        default = ClientConfig()

        # 往配置构建器中添加选项
        # 默认情况下，选项不需要管理员权限就能修改，如果需要进行限制，请添加.operator()
        # 一般而言，修改客户端选项无需管理员权限
        builder.switch('clientSwitch', config.clientSwitch, default.clientSwitch)
        builder.enum('clientEnum', config.clientEnum, default.clientEnum, ('one', 'two', 'three', 'four'))
        builder.int('clientInt', config.clientInt, default.clientInt, 0, 255)
        builder.float('clientFloat', config.clientFloat, default.clientFloat, 0.0, 1.0)
        builder.color('clientColor', config.clientColor, default.clientColor)
        # 默认情况下，按钮不需要管理员权限就能点击，如果需要进行限制，请添加.operator()
        # 一般而言，点击客户端按钮无需管理员权限
        builder.button('clientButton')

        # 进行注册
        comp.RegisterConfig(self.CONFIG_REGISTER_KEY, builder.build())

    def ClientConfigChangedEvent(self, args):
        # 客户端选项改变事件
        # 玩家修改了客户端的选项后，会触发该事件（如果选项已注册回调函数，则调用回调函数而不触发此事件）
        # 先判断命名空间，不是该模组注册的命名空间时不执行后续代码
        if args['namespace'] != self.CONFIG_REGISTER_KEY:
            return
        print 'ClientConfigChangedEvent: {}'.format(args)
        # 将变化后的值保存到实例中
        setattr(config, args['key'], args['value'])

    def ClientButtonClickedEvent(self, args):
        # 客户端按钮点击事件
        # 玩家点击了客户端的按钮选项后，会触发该事件（如果选项已注册回调函数，则调用回调函数而不触发此事件）
        # 先判断命名空间，不是该模组注册的命名空间时不执行后续代码
        if args['namespace'] != self.CONFIG_REGISTER_KEY:
            return
        print 'ClientButtonClickedEvent: {}'.format(args)
